package com.sicheng.lc.周赛.分类.贪心;

import java.util.Arrays;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/7/10 10:34
 */
public class 装满杯子需要的最短总时长 {
    //https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups/
    public int fillCups(int[] amount) {

        Arrays.sort(amount);
        int res = 0;
        int max = amount[2], max2 = amount[1];
        while (max != 0 && max2 != 0) {
            amount[2]--;
            amount[1]--;
            res++;
            Arrays.sort(amount);
            max = amount[2];
            max2 = amount[1];
        }

        return res + max;
    }

    // 大致思路俩俩抵消，复杂度优化到O(1)
    //  优先接2杯水，当只剩下一个时才接一杯水
    //  排序后 x,y,z
    // if  x+y <= z ，z不断抵消x，y抵消完了z自己还没消耗完，此过程消耗 z 秒
    // if  x+y >z   (俩部分耗时)
    // 1.x和y一起去抵消z，当x，y消耗到相等就，轮询x，y去抵消z 直到z空
    // 2.x,y 剩下的部分内部厮杀
    //   物理上是这样，逻辑上转化为下面的计算过程
    // z +  ceil((x+y-z)/2)
    int fillCup(int[] nums) {
        Arrays.sort(nums);
        int x = nums[0], y = nums[1], z = nums[2];
        if (x + y <= z)
            return z;
        return z + (x + y - z + 1) >> 1;
    }
}
